Forum des exercices du projet Zuul

Exercice 7.8

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.8
par anonfirstname2 anonlastname2, mardi 9 mars 2021, 19:52
 
Nouvelle notion : HashMap
- Introduction, au point 1 ci-dessous
- Explications, aux points 2 & 3 ci-dessous
- Utilisation dans le projet, aux points 4 & 5 ci-dessous
- Vérification de la compréhension, au point 6 ci-dessous

  1. Lisez la suite du chapitre 7 [ci-joint] (si possible en anglais, sinon en français).

  2. Pour mieux comprendre le fonctionnement d'une HashMap, lisez cette comparaison HashMap / tableau (avec exemples d'appels de méthodes et affichages correspondants).

  3. Pour encore plus d'explications, vous pouvez lire le début de ce tutoriel :
    - une HashMap est une table de hachage (expliquée au 8.1)
    - qui fonctionne exactement selon l'interface Map (expliquée au 8.2).
    Ne pas lire ce tutoriel à partir du 8.3.

  4. Implémentez dans votre projet les changements décrits dans cette partie du livre.
    N'y aurait-il pas une méthode inutile désormais dans la classe Room ?  Par quoi a-t-elle été remplacée ?
    Vous devez comprendre pourquoi son nom a été ainsi modifié.


  5. Même si ce n'est pas demandé explicitement, il est bien entendu nécessaire de modifier la fonction getExitString, puisque les sorties ne sont plus stockées de la même façon dans Room. Veuillez noter que cela ne change rien à l'extérieur de la classe Room, ce qui n'aurait pas été le cas si nous avions fait cette modification avant la création de getExitString.

  6.  Vérifiez votre compréhension :
    - générale avec cette petite page sur les HashMap
    - et de la fonction keySet() en lisant juste l'énoncé de l'exercice 7.9.
Avatar anonfirstname109 anonlastname109
Re: 7.8
par anonfirstname109 anonlastname109, samedi 9 février 2013, 17:04
 

J'ai fait les changement au niveau des sorties, c'est à dire que je me retrouve avec quelque chose comme: " ...setExits("ouest", ....);  j'ai commen erreur:

"cannot find symbol-method setExits(java.lang.String,Room).

Avatar anonfirstname2 anonlastname2
Re: 7.8
par anonfirstname2 anonlastname2, dimanche 10 février 2013, 19:05
 

Je suppose que vous confondez setExits et setExit :

- setExits (au pluriel) permettait de spécifier les 4 sorties d'une pièce

- setExit (au singulier) permet désormais de spécifier uniquement une sortie dans une direction

Avatar Yanis GUICHI
Re: Exercice 7.8
par Yanis GUICHI, jeudi 25 septembre 2014, 01:41
 

J'ai effectué les changements décrits par le livre dans la classe Room, mais j'ai maintenant un problème avec la méthode getExitsString().

Vu que l'on a supprimé les attributs aNorthExit, etc. pour les remplacer par la Hashmap, la compilation échoue.

Cela implique-t-il que cette méthode aussi nécessite une modification (bien que rien ne soit indiqué dans le texte) ou doit-on simplement la supprimer et modifier alors l'affichage des sorties dans la classe Game?

Cordialement.

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, jeudi 25 septembre 2014, 09:25
 

> "Cela implique-t-il que cette méthode aussi nécessite une modification"
oui bien sûr, puisque qu'on ne stocke plus les sorties de la même façon, on doit modifier la fonction dont le rôle est de produire une String contenant toutes les sorties d'une pièce

> "ou doit-on simplement la supprimer et modifier alors l'affichage des sorties dans la classe Game?"
je ne vois pas en quoi cela vous simplifierait les choses de la supprimer et de devoir écrire ailleurs les instructions nécessaires ...
De toute façon, le rôle de getExitString n'est pas modifié, c'est son implémentation qui l'est !

> "(bien que rien ne soit indiqué dans le texte)"
En fait, c'est l'objet de l'exercice 7.9 (il y a de nouveau une partie de livre à lire).

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, dimanche 5 octobre 2014, 17:50
 

Un étudiant a écrit :

Bonjour Monsieur,

J'ai suivi les modifications à apporter pour créer un objet de classe HashMap.

Lorsque je teste la procédure play(), le terminal ne m'affiche plus les sorties disponibles dans la pièce de départ et il me renvoie l'erreur java.lang.StackOverflowError: null dans la méthode getExit(String pDirection) au niveau de "if (pDirection.equals("north"))"

Comment pourrais-je corriger cette erreur ?

Merci
Cordialement

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, dimanche 5 octobre 2014, 17:55
 

L'exception StackOverflowError survient généralement lors d'une récursion infinie.

Je suppose donc que votre fonction getExit se rappelle elle-même (alors qu'elle ne devrait pas ...)

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, jeudi 9 mars 2017, 09:39
 

Un étudiant a écrit :

J'ai correctement implémenter l'objet du type HashMap.

De ce fait, au niveau de la méthode setExits, qui retourne plusieurs sorties d'une pièce et setExit, qui retourne une sortie dans une direction donné. Ne serait- il pas plus judicieux laisser setExits, puisque sinon la méthode setExit serait beaucoup plus long?

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, jeudi 9 mars 2017, 09:47
 
> J'ai correctement implémenter l'objet du type HashMap.
> De ce fait, au niveau de la méthode setExits, qui retourne plusieurs sorties d'une pièce
>
Non, setExits est une procédure, donc ne retourne rien.

> et setExit, qui retourne une sortie dans une direction donné.
>
Non, setExit est une procédure, donc ne retourne rien.
Peut-être confondez-vous avec getExit qui est une fonction qui retourne la pièce dans une direction donnée ?

> Ne serait- il pas plus judicieux laisser setExits, puisque sinon la méthode setExit serait beaucoup plus long?
>
Non, setExits ne sert plus à rien maintenant qu'on peut spécifier les sorties d'une pièce une par une avec setExit
(c'est beaucoup plus souple que d'être toujours obligé de spécifier 4 sorties avec setExits).
De plus, l'objectif est de pouvoir créer d'autres directions que juste Nord, Sud, Est, Ouest ; dans ce cas, setExits ne conviendrait plus !
Avatar Etienne CHEVET
Re: Exercice 7.8
par Etienne CHEVET, mercredi 29 janvier 2020, 17:23
 

1) J'ai effectué les modifications comme elles sont décrites dans le pdf au niveau des méthodes setExit, getExit, getExitString ainsi que createRooms.

Tout mon programme compile correctement, par contre quand j'essaie d'instancier un nouveau game, j'ai des erreurs de nullPointerException qui me renvoient à setExit, createRooms, ainsi que sur le constructeur de la classe game lorsqu'il appelle la méthode createRooms sur l'objet courant.

Je ne comprends pas comment je peux avoir des erreurs de nullPointerException car les objets auquels se rapportent mes méthodes sont soit:

-l'objet courant

-les Room instancié juste au dessus dans la méthode createRoom

-la hashMap exit que j'ai bien déclaré en tant qu'attribut au début de Room

2) Je ne sais pas si c'est indispensable pour l'instant mais je n'ai pas compris le concept de map.entry, pourrais-je avoir des explications s'il vous plait.

Merci


Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, jeudi 30 janvier 2020, 10:08
 
  1. Je crois que le noeud du problème se trouve dans cette phrase :
    "la hashMap exit que j'ai bien déclaré en tant qu'attribut au début de Room"
    J'ai bien l'impression que cet attribut n'a jamais été initialisé, donc qu'aucune HashMap n'a été créée ...

  2. Une Entry est un objet comportant une clé et une valeur ; ainsi, une HashMap peut être vue comme un ensemble d'Entry (couple clé,valeur).
    Mais nous nous contenterons d'utiliser l'ensemble des clés (keySet) pour accéder à la HashMap, puis la fonction get sur la clé qui nous intéresse.
Avatar anonfirstname123 anonlastname123
Re: Exercice 7.8
par anonfirstname123 anonlastname123, jeudi 7 février 2013, 23:04
 

Suite aux modifications apportées après avoir fais cet exercice, lorsque je compile on me dit que la method "setExit" (que j'utilise pour définir les sorties de mes "room") n'est pas définie!

Que faire ?

Avatar anonfirstname2 anonlastname2
Re: Exercice 7.8
par Denis BUREAU, vendredi 8 février 2013, 10:17
 

Je vois 2 causes possibles, et il faut bien regarder le message d'erreur pour décider laquelle vous concerne :

1) ce n'est pas tant la méthode setExit qui n'est pas définie, mais la méthode setExit(certains paramètres) alors que vous appelez la méthode setExit(autres paramètres)

2) vous avez oublié de changer le nom de setExits vers setExit (la méthode setExits traitait les 4 sorties alors que setExit n'en traite plus qu'une seule)

Avatar anonfirstname123 anonlastname123
Re: Exercice 7.8
par anonfirstname123 anonlastname123, vendredi 8 février 2013, 14:21
 

Dans la classe room, pour définir les sorties des pièces, je déclare la méthode "public Room setExit(String direction) { .... }".

La compilation dans la class room ne pause pas de problème mais dans la class game on me dit que "la methode setExit ne peut être appliqué à certains types" !

Je pense donc que le problème vient de la première cause dont vous avez parlé mais je ne vois vraiment pas comment régler le problème!

Avatar anonfirstname2 anonlastname2
Re: Exercice 7.8
par Denis BUREAU, vendredi 8 février 2013, 15:35
 

Oui, la méthode setExit ne peut pas être appliquée juste à une String.

Relisez les pages 216-217 du livre (version anglaise) -- ou 238 de la version française -- pour mieux comprendre les paramètres que doit posséder la méthode setExit.

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, dimanche 14 février 2021, 19:02
 

Un étudiant a écrit :

je ne comprend pas bien l'intérêt de la méthode setExit car c’est beaucoup plus long et fastidieux de placer les sorties chacune de nos pièces.
Y a t’il une utilisation à la quelle je n’ai pas pensé ?

Avatar Denis BUREAU
Re: Exercice 7.8
par Denis BUREAU, dimanche 14 février 2021, 19:20
 

1) C'est effectivement plus long et fastidieux de remplacer vR0.setExits( vR1, vR2, vR3, vR4); par :
     vR0.setExit( "north", vR1 );
     vR0.setExit( "east",  vR2 );
     vR0.setExit( "south", vR3 );
     vR0.setExit( "west",  vR4 );

2) Mais c'est légèrement plus court de remplacer vR0.setExits( vR1, null, null, null ); par :
     vR0.setExit( "north", vR1 );

3) De toute façon, c'est plus clair de préciser la sortie en indiquant la direction, plutôt que devoir savoir par coeur l'ordre dans lequel on doit passer les sorties, tout en se demandant si on ne s'est pas pas trompé entre nord/est/sud/ouest et nord/sud/est/ouest ...

4) Et surtout, cela permet de créer de nouvelles directions telles que "up" & "down", ou "NE", "SE", "SO", "NO", ou d'autres, sans avoir à prévoir 10 paramètres dans setExit qui vaudraient null la plupart du temps.

Avatar anonfirstname109 anonlastname109
Re: 7.8
par Denis BUREAU, samedi 19 février 2022, 19:04
 

Un étudiant a écrit :

J'aurais une question à propos de l'affiche "Unknown direction !" dans le cas où la direction donnée est un mot inconnu.
À la fin de l'exercice 7.6 j'ai pu résoudre le problème grâce à la 3e solution que vous aviez proposé dans la discussion, en créant un attribut statique de classe UNKNOWN_DIRECTION et en suivant la démarche que vous aviez expliqué.

Cependant, en ajoutant la Hashmap dans l'exercice 7.8, j'ai effacé tous les if .../...
Je ne peux donc plus laisser le return UNKNOWN_DIRECTION à la fin...
Maintenant, quand le 2e mot est inconnu il m'affiche seulement "There's no door !".

J'ai essayé de créer une boucle et un if à l'intérieur de getExit() de sorte à ce que ça retourne UNKNOWN_DIRECTION si la clé n'est pas contenu dans l'ensemble des clés mais je n'ai pas réussi.
Pourriez-vous m'éclairer à ce sujet s'il-vous-plaît ? Ou est-ce normal d'avoir "There's no door !" ?

Avatar anonfirstname2 anonlastname2
Re: 7.8
par Denis BUREAU, samedi 19 février 2022, 19:45
 

Très bonne question !
C'est vrai que maintenant que nous n'avons plus à tester les 4 directions, nous ne savons plus que la direction est incorrecte.
Et ce n'est pas en examinant toutes les directions présentes dans la HashMap que nous serons plus avancés : imaginez une pièce ne comportant que les sorties Nord et Sud ; nous déclarerions Est et Ouest comme des directions inconnues !?

Nous sommes face à un problème qui n'a pas de solution simple. La solution qui vient naturellement à l'esprit est d'imiter la gestion des commandes : créer une classe DirectionWords comportant le tableau des directions reconnues et une fonction isDirection par exemple.
Il faudra créer un objet de cette classe dans la classe Game, puisque c'est là qu'on doit traiter le problème.